#!/bin/bash

CONFIG_FILE="vserial.conf"
MAX_DEVICES=8

# 显示帮助信息
show_help() {
    echo "虚拟串口配置工具"
    echo "用法: $0 [选项] [配置文件]"
    echo ""
    echo "选项:"
    echo "  -h, --help     显示此帮助信息"
    echo "  -p, --params   显示模块参数"
    echo "  -c, --command  显示加载命令"
    echo "  -t, --test     生成测试脚本"
    echo "  -a, --all      显示所有信息"
    echo ""
    echo "配置文件格式:"
    echo "  设备名,IP地址,端口,描述"
    echo "  例如: ttyV0,127.0.0.1,5000,串口1"
    echo ""
}

# 解析配置文件
parse_config() {
    local config_file="$1"
    local line_num=0
    local device_count=0
    
    # 清空数组
    unset device_names
    unset ip_addresses
    unset ports
    unset descriptions
    
    if [ ! -f "$config_file" ]; then
        echo "错误: 配置文件 $config_file 不存在" >&2
        return 1
    fi
    
    while IFS= read -r line; do
        line_num=$((line_num + 1))
        
        # 跳过空行和注释行
        if [[ -z "$line" || "$line" =~ ^[[:space:]]*# ]]; then
            continue
        fi
        
        # 解析CSV格式
        IFS=',' read -r device_name ip_address port description <<< "$line"
        
        # 验证必要字段
        if [ -z "$device_name" ] || [ -z "$ip_address" ] || [ -z "$port" ]; then
            echo "警告: 第${line_num}行格式错误，跳过" >&2
            continue
        fi
        
        # 验证端口号
        if ! [[ "$port" =~ ^[0-9]+$ ]] || [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then
            echo "警告: 第${line_num}行端口号无效: $port" >&2
            continue
        fi
        
        # 存储到数组
        device_names[$device_count]="$device_name"
        ip_addresses[$device_count]="$ip_address"
        ports[$device_count]="$port"
        descriptions[$device_count]="${description:-未命名}"
        
        device_count=$((device_count + 1))
        
        # 检查设备数量限制
        if [ $device_count -ge $MAX_DEVICES ]; then
            echo "警告: 达到最大设备数量限制 ($MAX_DEVICES)" >&2
            break
        fi
        
    done < "$config_file"
    
    echo "$device_count"
}

# 显示模块参数
show_params() {
    local device_count="$1"
    echo "模块参数:"
    echo "num_devices=$device_count"
    
    for ((i=0; i<device_count; i++)); do
        echo "设备$i: ${device_names[$i]} -> ${ip_addresses[$i]}:${ports[$i]} (${descriptions[$i]})"
    done
}

# 验证并调整重连间隔
validate_reconnect_interval() {
    local interval="$1"
    local default_interval=10
    
    # 检查是否为数字
    if ! [[ "$interval" =~ ^[0-9]+$ ]]; then
        echo "警告: 重连间隔 '$interval' 不是有效数字，使用默认值 $default_interval 秒" >&2
        echo "$default_interval"
        return 0
    fi
    
    # 调整范围
    if [ "$interval" -lt 1 ]; then
        echo "警告: 重连间隔 $interval 秒太短，调整为 1 秒" >&2
        echo "1"
    elif [ "$interval" -gt 30 ]; then
        echo "警告: 重连间隔 $interval 秒太长，调整为 30 秒" >&2
        echo "30"
    else
        echo "$interval"
    fi
}

# 生成加载命令
generate_load_command() {
    local device_count="$1"
    local reconnect_interval="${2:-10}"  # 默认10秒
    
    # 验证并调整重连间隔
    reconnect_interval=$(validate_reconnect_interval "$reconnect_interval")
    
    local cmd="sudo insmod vserial_stj.ko num_devices=$device_count reconnect_interval=$reconnect_interval"
    
    for ((i=0; i<device_count; i++)); do
        cmd="$cmd dev${i}_name=${device_names[$i]} dev${i}_ip=${ip_addresses[$i]} dev${i}_port=${ports[$i]}"
    done
    
    echo "$cmd"
}

# 生成测试脚本
generate_test_script() {
    local device_count="$1"
    
    cat << EOF
#!/bin/bash
echo "=== 虚拟串口测试 ==="

EOF
    
    # 启动TCP服务器
    for ((i=0; i<device_count; i++)); do
        cat << EOF
# 启动TCP服务器 ${descriptions[$i]}
./tcp_server ${ports[$i]} &
SERVER${i}_PID=\$!
sleep 1

EOF
    done
    
    cat << EOF
sleep 2

EOF
    
    # 测试各个串口
    for ((i=0; i<device_count; i++)); do
        cat << EOF
# 测试 ${device_names[$i]}
echo "test$i" | ./serial_test /dev/${device_names[$i]} &
sleep 1

EOF
    done
    
    cat << EOF
echo "等待测试完成..."
sleep 5

# 清理
EOF
    
    for ((i=0; i<device_count; i++)); do
        echo "kill \$SERVER${i}_PID 2>/dev/null"
    done
    
    cat << EOF
sudo rmmod vserial_stj
echo "测试完成"
EOF
}

# 查找配置文件
find_config_file() {
    local config_file="$1"
    
    # 如果指定了完整路径，直接使用
    if [[ "$config_file" =~ ^/ ]]; then
        echo "$config_file"
        return 0
    fi
    
    # 按优先级查找配置文件
    local search_paths=(
        "./$config_file"                    # 当前目录
        "$HOME/.vserial/$config_file"       # 用户目录
        "/etc/vserial/$config_file"         # 系统配置
        "/usr/local/etc/vserial/$config_file" # 本地系统配置
    )
    
    for path in "${search_paths[@]}"; do
        if [ -f "$path" ]; then
            echo "$path"
            return 0
        fi
    done
    
    return 1
}

# 主函数
main() {
    local config_file="vserial.conf"
    local show_params_flag=0
    local show_command_flag=0
    local show_test_flag=0
    local show_all_flag=0
    
    # 解析命令行参数
    while [[ $# -gt 0 ]]; do
        case $1 in
            -h|--help)
                show_help
                exit 0
                ;;
            -p|--params)
                show_params_flag=1
                shift
                ;;
            -c|--command)
                show_command_flag=1
                shift
                ;;
            -t|--test)
                show_test_flag=1
                shift
                ;;
            -a|--all)
                show_all_flag=1
                shift
                ;;
            -*)
                echo "错误: 未知选项 $1" >&2
                show_help
                exit 1
                ;;
            *)
                config_file="$1"
                shift
                ;;
        esac
    done
    
    # 如果没有指定选项，默认显示所有信息
    if [ $show_params_flag -eq 0 ] && [ $show_command_flag -eq 0 ] && [ $show_test_flag -eq 0 ] && [ $show_all_flag -eq 0 ]; then
        show_all_flag=1
    fi
    
    # 查找配置文件
    local actual_config_file
    actual_config_file=$(find_config_file "$config_file")
    
    if [ $? -ne 0 ]; then
        echo "错误: 找不到配置文件 $config_file" >&2
        echo "搜索路径:" >&2
        echo "  ./$config_file" >&2
        echo "  $HOME/.vserial/$config_file" >&2
        echo "  /etc/vserial/$config_file" >&2
        echo "  /usr/local/etc/vserial/$config_file" >&2
        exit 1
    fi
    
    # 解析配置文件
    local device_count
    device_count=$(parse_config "$actual_config_file")
    
    if [ $? -ne 0 ] || [ "$device_count" -eq 0 ]; then
        echo "错误: 没有找到有效的配置项" >&2
        exit 1
    fi
    
    echo "配置文件: $actual_config_file"
    echo "找到 $device_count 个设备配置"
    echo ""
    
    if [ $show_params_flag -eq 1 ] || [ $show_all_flag -eq 1 ]; then
        show_params "$device_count"
        echo ""
    fi
    
    if [ $show_command_flag -eq 1 ] || [ $show_all_flag -eq 1 ]; then
        echo "加载命令:"
        generate_load_command "$device_count"
        echo ""
    fi
    
    if [ $show_test_flag -eq 1 ] || [ $show_all_flag -eq 1 ]; then
        echo "测试脚本:"
        generate_test_script "$device_count"
        echo ""
    fi
}

# 运行主函数
main "$@" 